package me.nibo.tree.utils;

import java.util.ArrayList;
import java.util.List;

/**
 * 树节点类
 *
 * @author nibo
 */
public class Node {
    // 节点id
    private String id;
    // 父节点id，根节点pid=""
    private String pid="";
    // 节点名称
    private String name;
    // 层级
    private int level;
    // 是否展开，true：展开；false：收起
    private boolean isExpand = false;
    // 父节点
    private Node parent;
    // 子节点
    private List<Node> childNodes = new ArrayList<>();
    // 图标资源id
    private int icon;

    public Node() {
    }

    /**
     *
     * @param id 节点id
     * @param pid 父节点id
     * @param name 节点名称
     */
    public Node(String id, String pid, String name) {
        this.id = id;
        this.pid = pid;
        this.name = name;
    }

    /**
     * @param id         节点id
     * @param pid        父节点
     * @param name       节点名称
     * @param level      层级
     * @param isExpand   是否展开，true：展开；false：收起
     * @param parent     父节点
     * @param childNodes 子节点
     * @param icon       图标资源id
     */
    public Node(String id, String pid, String name, int level, boolean isExpand,
                Node parent, List<Node> childNodes, int icon) {
        this.id = id;
        this.pid = pid;
        this.name = name;
        this.level = level;
        this.isExpand = isExpand;
        this.parent = parent;
        this.childNodes = childNodes;
    }

    /**
     * 是否是根节点
     *
     * @return true：是；false：否
     */
    public boolean isRoot() {
        return null == pid || "".equals(pid);
    }

    /**
     * 当前节点的父节点收缩状态
     *
     * @return true：展开；false：收起
     */
    public boolean isParentExpand() {
        return null != parent && parent.isExpand;
    }

    /**
     * 是否是叶子节点
     *
     * @return true：是；false：否
     */
    public boolean isLeaf() {
        return childNodes.size() == 0;
    }

    /**
     * @return 层级
     */
    public int getLevel() {
        return null == parent ? 0: parent.getLevel() + 1;
    }

    /**
     * @param isExpand 是否展开，true：展开；false：收起
     */
    public void setExpand(boolean isExpand) {
        this.isExpand = isExpand;
        // 当前节点为收起状态，则节点下的所有子节点也为收起状态
        if (!isExpand) {
            for (Node n : childNodes) {
                n.setExpand(false);
            }
        }
    }

    /**
     * @return 节点id
     */
    public String getId() {
        return id;
    }

    /**
     * @param id 节点id
     */
    public void setId(String id) {
        this.id = id;
    }

    /**
     * @return 父节点
     */
    public String getPid() {
        if (null == pid) {
            return "";
        }
        return pid;
    }

    /**
     * @param pid 父节点
     */
    public void setPid(String pid) {
        this.pid = pid;
    }

    /**
     * @return 节点名称
     */
    public String getName() {
        return name;
    }

    /**
     * @param name 节点名称
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * @param level 层级
     */
    public void setLevel(int level) {
        this.level = level;
    }

    /**
     * @return 是否展开，true：展开；false：收起
     */
    public boolean isExpand() {
        return isExpand;
    }

    /**
     * @return 父节点
     */
    public Node getParent() {
        return parent;
    }

    /**
     * @param parent 父节点
     */
    public void setParent(Node parent) {
        this.parent = parent;
    }

    /**
     * @return 子节点
     */
    public List<Node> getChildNodes() {
        return childNodes;
    }

    /**
     * @param childNodes 子节点
     */
    public void setChildNodes(List<Node> childNodes) {
        this.childNodes = childNodes;
    }

    /**
     * @return 图标资源id
     */
    public int getIcon() {
        return icon;
    }

    /**
     * @param icon 图标资源id
     */
    public void setIcon(int icon) {
        this.icon = icon;
    }

    @Override
    public String toString() {
        return "Node{" +
                "id='" + id + '\'' +
                ", pid='" + pid + '\'' +
                ", name='" + name + '\'' +
                ", level=" + level +
                ", isExpand=" + isExpand +
                ", parent=" + parent +
                ", childNodes=" + childNodes +
                ", icon=" + icon +
                '}';
    }
}
